iptables（防火墙）与netfilter
=================================================
推荐博客：
    http://www.360doc.com/content/11/0506/09/706976_114731108.shtml#
    http://drops.wooyun.org/tips/1424

netfilter/iptables 简介：
    （1）IP数据包过滤系统由 netfilter 和 iptables 两个组件构成。
    （2）netfilter是集成在内核中的一部分，其作用是定义、保存相应的规则，
    （3）iptables是一种工具，用来修改信息的过滤规则及其他配置，而这些规则会保存在内核空间之中。
    （4）netfilter是Linux核心中的一个通用架构，其提供了一系列的表（tables）每个表由若干个链（chains）组成，而每条链可以由一条或若干条规则（rules）组成。

防火墙工作流程：
<img src="./img/2.png" alt="">
<img src="http://img.blog.csdn.net/20160506173935614?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

报文流向：
    （1）流入本机：PREROUTING --> INPUT ==> 用户空间进程。
    （2）流出本机：用户空间进程==> OUTPUT --> POSTROUTING
    （3）转发：PREROUTING --> FORWARD --> POSTROUTING
    注释：==> 进入用户空间， --> 进入系统空间。

四表（同一链上的不同的表的规则优先级 高-->低）：
    （1）：raw：关闭在nat表启用的连接追踪机制。
            表与链关系：PREROUTING -> OUTPUT
    （2）：mangle：拆解报文，按需修改。
            表与链关系：PREROUTING -> INPUT -> FORWARD -> OUTPUT -> POSTROUTING
    （3）：nat：network address translation (ip层地址，传输层地址)。
            表与链关系：PREROUTING -> INPUT -> OUTPUT -> POSTROUTING
    （4）：filter：过滤，防火墙。
            表与链关系：INPUT -> FORWARD -> OUTPUT

五链（netfilter）：五个参考点实现报文管理功能。
    （1）：PREROUTING：     数据包进入路由表之前
    （2）：INPUT：                 通过路由表后目的地为本机
    （3）：FORWARD：   通过路由表后，目的地不为本机
    （4）：OUTPUT：             由本机产生，向外转发
    （5）：POSTROUTIONG：发送到网卡接口之前

=================================================
iptables 使用：
    服务应用：
        CentOS 7
            ~]# systemctl  stop  firewalld.service
            ~]# systemctl  disable  firewalld.service
        CentOS 6
            ~]# service  iptables  stop
            ~]# chkconfig  iptables  off
...........................................................................................................................................................................
（1）命令
    格式：iptables  [-t  table]   SUBCOMMAND  chain  [matches...]   [target] 
               iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
    ...........................................................................................................................................................................
    -t table： raw, mangle, nat, [filter]
        ~]# iptables -t raw -nvL
        ~]# iptables -t mangle -nvL
        ~]# iptables -t nat -nvL
        ~]# iptables -nvL
    ...........................................................................................................................................................................
（2）SUBCOMMAND：
        （2.1） 链管理：
            -N： new：新增一条自定义链。
                ~]# iptables -N test
            -X：delete：删除自定义的空链。
                 ~]# iptables -X mytest
            -P：policy：设置链的默认策略。
                    ACCEPT：接受
                    DROP：丢弃
                    REJECT：拒绝：互联网访问时最好不要使用REJECT。
                ~]# iptables -t filter -P FORWARD DROP
                ~]# iptables -t filter -P INPUT DROP
                ~]# iptables -t filter -P OUTPUT DROP
                备注：设置 filter 规则控制时要先将 FORWARD，INPUT，OUTPUT 设为 DROP 或者 REJECT
            -E：rename：重命名自定义的未被引用（引用计数为0）的链。
                ~]# iptables -E test mytest

        （2.2） 规则管理：
            -A：append：插入到末尾（最后一个）。
            -I：insert：插入到开始（第一个）。
            -D：delete：删除。
                1：rule specification
                2：rule number
                    ~]# iptables -D OUTPUT 1
            -R：replace：替换。
            -F：flush：清洗，清空。
            -Z：zero：清 0。
                iptables的每条规则都有两个计数器。
                    1：由本规则匹配到的所有的packets。
                    2：由本规则匹配到的所有的bytes。
            S：selected，以 iptables-save 命令的格式显示链上的规则。

        （2.3）查看：
            -L: list，列出规则
                -n：numeric，以数字格式显示地址和端口；
                -v：verbose，详细信息；-vv, -vvv
                -x：exactly，显示计数器的精确值而非单位换算后的结果
                --line-numbers：显示链上的规则的编号
                    ~]# iptables -nvL --line-numbers
            组合：-nvL
                ~]# iptables -nvL
...........................................................................................................................................................................
（3）matches 匹配条件：
1：基本匹配：netfilter自带的匹配机制
    [!] -s, --source address[/mask][,...]：原地址匹配
        ~]# iptables -A INPUT -s 172.18.0.0/16 -j ACCEPT
        ~]# iptables -A OUTPUT -s 172.18.0.0/16 -j ACCEPT
        ~]# iptables -A FORWARD -s 172.18.0.0/16 -j ACCEPT

    [!] -d, --destination address[/mask][,...]：目标地址匹配
        ~]# iptables -A INPUT -s 172.18.21.72 -d 172.18.21.62 -j ACCEPT
        ~]# iptables -A OUTPUT -s 172.18.21.62 -d 172.18.21.72 -j ACCEPT

    [!] -i, --in-interface name：限制报文流入的接口，只能用于PREROUTING，INPUT及FORWARD。
    [!] -o, --out-interface name：限制报文流出的接口，只能用于OUTPUT，FORWARD及POSTROUTING。
    [!] -p {tcp|udp|icmp}：限制协议
     ~]# iptables -I INPUT -s 172.18.21.72 -d 172.18.21.62 -p tcp -j ACCEPT
     ~]# iptables -I OUTPUT -s 172.18.21.62 -d 172.18.21.72 -p tcp -j ACCEPT

2：扩展匹配：经由扩展模块引入的匹配机制，-m matchname
                注释：
                    隐式扩展：可以不用使用-m选项专门加载相应模块；前提是要使用-p选项可匹配何种协议。
                    显式扩展：必须由-m选项专门加载相应模块。

    (1)：隐式扩展：
        [!]  -p, --protocol PROTOCOL PROTOCOL:
            协议：tcp, udp, icmp, icmpv6, esp, ah, sctp, mh or "all"

            tcp: 隐含指明了“-m tcp”，有专用选项：
                [!] --source-port,--sport  port[:port]：匹配报文中的tcp首部的源端口；可以是端口范围。
                [!] --destination-port,--dport port[:port]：匹配报文中的tcp首部的目标端口；可以是端口范围。
                    ~]# iptables -A INPUT -s 0/0 -d 172.18.21.62 -p tcp --dport 22 -j ACCEPT
                    ~]# iptables -A OUTPUT -s 172.18.21.62 -d 0/0 -p tcp --sport 22 -j ACCEPT
                    注释：放行ssh连接。
                    ~]# iptables -A INPUT -s 0/0 -d 172.18.21.62 -p tcp --dport 80 -j ACCEPT
                    ~]# iptables -A OUTPUT -s 172.18.21.62 -d 0/0 -p tcp --sport 80 -j ACCEPT
                    注释：开放 80 端口

                [!] --tcp-flags mask comp：检查报文中mask指明的tcp标志位，而要这些标志位comp中必须为1；
                    --tcp-flags  syn,fin,ack,rst  syn
                    --tcp-flags  syn,fin,ack,rst  ack,fin
                [!] --syn：
                    --syn相当于“--tcp-flags  syn,fin,ack,rst  syn”；tcp三次握手的第一次；

            udp：隐含指明了“-m udp”，有专用选项：
                [!] --source-port,--sport  port[:port]：匹配报文中的udp首部的源端口；可以是端口范围；
                [!] --destination-port,--dport port[:port]：匹配报文中的udp首部的目标端口；可以是端口范围；

            icmp：隐含指明了“-m icmp”，有专用选项：
                [!] --icmp-type {type[/code]|typename}
                    type/code: 
                        0/0：echo reply：请求
                        8/0：echo request ：响应
                    ~]# iptables -A OUTPUT -s 172.18.21.62 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT
                    ~]# iptables -A INPUT -s 0/0 -d 172.18.21.62 -p icmp --icmp-type 0 -j ACCEPT
                    ~]# iptables -A INPUT -d 172.18.21.62 -p icmp --icmp-type 8 -j ACCEPT
                    ~]# iptables -A OUTPUT -s 172.18.21.62 -p icmp --icmp-type 0 -j ACCEPT
                注释：icmp type：http://baike.baidu.com/link?url=rph8HhXWXtekVwXLMz2FcUHaPru6DgG7-fDXFJOUt4qGann-4pwVaCTnF0JiGNiCzeiOg51fQzhWY8XEP_tyE_#7


    (2)：显式扩展：
            (1)：multiport：多端口匹配：以离散方式定义多端口匹配，最多可以指定15个端口；
                [!] --source-ports,--sports port[,port|,port:port]...
                [!] --destination-ports,--dports port[,port|,port:port]...
                [!] --ports port[,port|,port:port]...

                    ~]# iptables -I INPUT -s 0/0 -d 172.18.21.62 -p tcp -m multiport --dports 22,80 -j ACCEPT
                    ~]# iptables -I OUTPUT -d 0/0 -s 172.18.21.62 -p tcp -m multiport --sports 22,80 -j ACCEPT

            (2)：iprange：指明一段连续的ip地址范围做为源地址或目标地址匹配；
                [!] --src-range from[-to]：源地址范围 
                [!] --dst-range from[-to]：目标地址范围

                    ~]# iptables -A INPUT -d 172.18.21.62 -p tcp --dport 23 -m iprange --src-range 172.18.21.1-172.18.21.100 -j ACCEPT
                    ~]# iptables -A OUTPUT -s 172.18.21.62 -p tcp --sport 23 -m iprange --dst-range 172.18.21.1-172.18.21.100

            (3)：string：对报文中的应用层数据做字符串匹配检测；
                --algo {bm|kmp}：(bm = Boyer-Moore, kmp = Knuth-Pratt-Morris) 算法
                [!] --string pattern：给定要检查的字符串模式；
                [!] --hex-string pattern：给定要检查的字符串模式；

                ~]# iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT
                ~]# iptables -I OUTPUT -s 172.18.21.62 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT

            (4)：time：根据收到报文的时间/日期与指定的时间/日期范围进行匹配。
                --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]：起始日期时间。
                --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]：结束日期时间。
                --timestart hh:mm[:ss]：起始时间。
                --timestop hh:mm[:ss]：结束时间。
                [!] --monthdays day[,day...]：匹配一个月中的哪些天。
                [!] --weekdays day[,day...]：匹配一个周中的哪些天。

                ~]# iptables -R INPUT 4 -d 172.18.100.6 -p tcp --dport 23 -m iprange --src-range 172.18.100.1-172.18.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
                ~]# iptables -I INPUT -d 172.18.21.62 -p tcp --dport 23 -m iprange --src-range 172.18.21.1-172.18.21.100 -m time --timestart 09:00:00 --timestop 18:00:00 -j ACCEPT

            (5)：connlimit：根据每客户端主机做并发连接数限制，即每客户端最多可同时发起的连接数量；
                --connlimit-upto n：连接数量小于等于n则匹配；
                --connlimit-above n：连接数量大于n则匹配；

                ~]# iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
                ~]# iptables -A INPUT -s 0/0 -d 172.18.21.62 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
                ~]# iptables -A INPUT -d 172.18.21.62 -p tcp --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT


            (6)：limit：基于令牌桶算法对报文的速率做匹配；
                --limit rate[/second|/minute|/hour|/day]
                --limit-burst number

                ~]# iptables -A INPUT -d 172.18.21.62 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT
                ~]# iptables -A OUTPUT -s 172.18.21.62 -p icmp --icmp-type 0 -j ACCEPT

            (7)：state：是conntrack的子集，用于对报文的状态做连接追踪
                [!] --state state
                    INVALID：无法识别的连接。
                    ESTABLISHED：连接追踪模板当中存在记录的连接。
                    NEW：连接追踪模板当中不存的连接请求。
                    RELATED：相关联的连接。
                    UNTRACKED：未追踪的连接。

                1：已经追踪到的并记录下来的连接：cat /proc/net/nf_conntrack

                2：连接追踪功能所能够记录的最大连接数量(可调整)： /proc/sys/net/nf_conntrack_max
                    ~]# sysctl -w net.nf_conntrack_max=300000     #第一种方式
                        net.nf_conntrack_max = 300000
                    ~]# echo 200000 > /proc/sys/net/nf_conntrack_max        #第二种方式
                    ~]# cat /proc/sys/net/nf_conntrack_max 
                        200000

                    conntrack所能够追踪的连接数量的最大值取决于/proc/sys/net/nf_conntrack_max的设定；已经追踪到的并记录下来的连接位于/proc/net/nf_conntrack文件中，超时的连接将会被删除；当模板满载时，后续的新连接有可能会超时；解决办法：
                        (1) 加大nf_conntrack_max的值；
                        (2) 降低nf_conntrack条目的超时时长；
                            不同协议的连接追踪时长：/proc/sys/net/netfilter/
                示例1：
                    ~]# iptables -A INPUT -s 172.18.0.0/16 -d 172.18.21.62 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT
                    ~]# iptables -A OUTPUT -d 172.18.0.0/16 -s 172.18.21.62 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEPT
                    ~]# iptables -A INPUT -d 172.18.21.62 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
                    ~]# iptables -A OUTPUT -s 172.18.21.62 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
                示例2：
                    ~]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
                    ~]# iptables -A INPUT -d 172.18.21.62 -p tcp -m multiport --dports 22,23,80 -m state --state NEW -j ACCEPT
                    ~]# iptables -A INPUT -d 172.18.21.62 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
                    ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
                示例3：
                    ~]# modinfo nf_conntrack_ftp
                    ~]# modprobe nf_conntrack_ftp
                    ~]# lsmod | grep ftp
                        nf_conntrack_ftp       11953  0 
                        nf_conntrack           79206  7 nf_conntrack_ftp,xt_connlimit,iptable_nat,nf_nat,nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state
                    ~]# service vsftpd restart
                    ~]# iptables -A INPUT -d 172.18.21.62 -p tcp --dport 21 -m state --state NEW -j ACCEPT
                    ~]# iptables -I INPUT -d 172.18.21.62 -m state --state ESTABLISHED -j ACCEPT

........................................................................................................................................................................... 
（4）：保存与启动规则
1：保存：
    CentOS 6：
        ~]# service  iptables  save 
        ~]# iptables-save  > /etc/sysconfig/iptables
        ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE
    CentOS 7：
        ~]# iptables  -S  > /PATH/TO/SOME_RULE_FILE
        ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE

2：启动：
    手动：
        ~]# iptables-restore  <  /PATH/FROM/SOME_RULE_FILE

        CentOS 6：service  iptables  restart
            备注：自动从 /etc/sysconfig/iptables 文件中重载规则。

    自动：
        (1)：/etc/rc.d/rc.local
                ~]# vi /etc/rc.d/rc.local
                 iptables-restore  <  /PATH/FROM/SOME_RULE_FILE

        (2)：/usr/bin/iptables.sh
                ~]# vi /usr/bin/iptables.sh
                 iptables-restore  <  /PATH/FROM/SOME_RULE_FILE

........................................................................................................................................................................... 
（4）处理动作：
        -j  targetname  [per-target-options]
            1：ACCEPT, DROP, REJECT
            2：RETURN：返回调用的链
                示例：
                    ~]# iptables -N web
                    ~]# iptables -A web -s 10.0.1.0/24 -p tcp --dport 80 -j ACCEPT
                    ~]# iptables -I web 1 -m string --alog kmp --string "old" -j REJECT
                    ~]# iptables -I web 2 -p tcp -m state --state ESTABLISHED -j ACCEPT
                    ~]# iptables -A FORWARD -p tcp -j web
                    ~]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 22 -m state --state NEW -J ACCEPT
                    ~]# iptables -A web -j RETURN
                            注释：返回调用者（默认隐含）。
    
            3：REDIRECT：端口重定向，端口映射：仅使用在 PREROUTING 和 OUTPUT 链。
                --to-ports port[-port]
                示例：
                    ~]# 修改监听端口为 8080 。
                    ~]# iptables -t nat -A PREROUTING -d 172.18.21.72 -p tcp --dport 80 -j REDIRECT  --to-ports 8080
                访问：
                    http://172.18.21.72:8080
                    http://172.18.21.72

            4：LOG：日志
                --log-level level：等级（默认为4）：emerg, alert, crit, error, warning, notice, info or debug.
                --log-prefix prefix：指定前缀
                示例：
                    ~]# iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "(new connctions)"
                日志记录位置：
                    ~]# cat /var/log/messages

            5：MARK：防火墙标记

            6：SNAT：源地址转换：修改IP报文中的源IP地址：POSTROUTING 和 INPUT （CentOS 7 支持） 链
                  --to-source [ipaddr[-ipaddr]]           

                 示例：
                    ~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.21.71
                    ~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.21.70-172.18.21.100

                备注：让本地网络中的主机可使用统一地址与外部主机通信，从而实现地址伪装
                    请求：由内网主机发起，修改源IP，如果修改则由管理员定义
                    响应：修改目标IP，由nat自动根据会话表中追踪机制实现相应修改

            7：DNAT：目标地址转换：修改IP报文中的目标IP地址：RPEROUTING 和 OUTPUT （CentOS 7）链
                --to-destination [ipaddr[-ipaddr]][:port[-port]]

                示例1：
                    ~]# iptables -t nat -A PREROUTING -d 172.18.21.71 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.2
                    ~]# curl http://172.18.21.71/
                示例2：
                    ~]# 修改 10.0.1.2 监听地址为 Listen 8090
                    ~]# iptables -t nat -A PREROUTING -d 172.18.21.71 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.2:8090
                    ~]# curl http://172.18.21.71/

                备注：让本地网络中服务器使用统一的地址向外提供服务（发布服务），但隐藏了自己的真实地址。
                    请求：由外网主机发起，修改其目标地址，由管理员定义。
                    响应：修改源地址，但由nat自动根据会话表中的追踪机制实现对应修改。


            8：MASQERADE：地址伪装，地址动态伪装
                示例：
                    ~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE

            9：recent：
...........................................................................................................................................................................
完整的示例：

设置网卡地址：nmtui
<img src="./img/3.png" alt="">
<img src="http://img.blog.csdn.net/20160506174024239?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

基本设置：
    关闭 CentOS6 的iptables 和 CentOS7的 firewalld。
    清空三台主机的防火墙规则：
        ~]# iptables -F

    主机：172.18.21.71
    查看是否打开网卡转发：
        ~]# cat /proc/sys/net/ipv4/ip_forward
    开启网卡转发：
        ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
    备注：地址属于内核不属于网卡。
    注释：
        1：10.0.1.1未设置网关的时候不能 ping 通172.18.21.71，但是可以ping通10.0.1.1
        2：172.18.21.71设置转发后可以 ping 通172.18.21.72，但是得不到 ping 回应。
                主机：10.0.1.1
                ~]# ping 172.18.21.72
                主机：172.18.21.72：抓包查看。
                ~]# tcpdump -i eno16777736 icmp
                注释：172.18.21.72主机回应了但是回应到了网关。

    添加路由：
        主机：172.18.21.72
        ~]# route add -net 10.0.1.0/24 gw 172.18.21.71
        ~]# route -n
            Kernel IP routing table
            Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
            0.0.0.0         172.18.0.1      0.0.0.0         UG    100    0        0 eno16777736
            10.0.1.0        172.18.21.71    255.255.255.0   UG    0      0        0 eno16777736
            172.18.0.0      0.0.0.0         255.255.0.0     U     100    0        0 eno16777736
        注释：此时 10.0.1.2主机ping请求172.18.21.72得到回应。


    主机：172.18.21.71
    ~]# iptables -P FORWARD DROP
    ~]# tcpdump -i eno16777736 -nn icmp -vv
    基础写法：
        内网 ping 外网
        ~]# iptables -A FORWARD -s 10.0.1.0/24 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT
        ~]# iptables -A FORWARD -s 0/0 -d 10.0.1.0/24 -p icmp --icmp-type 0 -j ACCEPT
        外网 ping 内网
        ~]# iptables -A FORWARD -s 10.0.1.0/24 -d 0/0 -p icmp --icmp-type 0 -j ACCEPT
        ~]# iptables -A FORWARD -s 0/0 -d 10.0.1.0/24 -p icmp --icmp-type 8 -j ACCEPT

    合并写法：
        ~]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
        内部 ping 外部
        ~]# iptables -A FORWARD -s 10.0.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
        外网 ping 内网
        ~]# iptables -A FORWARD -s 0/0 -d 10.0.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
        同时允许内网和外网互 ping
        ~]# iptables -A FORWARD -p icmp -m state --state NEW -j ACCEPT
        ~]# lsmod | grep ftp


    内网访问外网服务 80和21
        ~]# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
        ~]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
        ~]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT
        ~]# modprobe nf_conntrack_ftp
        合并写法：
            ~]# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
            ~]# iptables -A FORWARD -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21 -m state --state NEW -j ACCEPT